package Modelos;

import ClasesEnvolventes.BooleanAparcadoImpl;
import Escenario.*;

public class ModeloGeneral{
	
	private BooleanAparcadoImpl aparcado = new BooleanAparcadoImpl();
	
	public void aplicar(EscenarioImpl esc, boolean conAcelmax, double[] probCreacionTiposCond, double[] probAparcarTiposCond, double[] probCreacionTiposVeh){
		
		ModeloGeneracion modgeneracion = new ModeloGeneracion();
		ModeloComportamiento modcomportamiento = new ModeloComportamientoImpl();
		ModeloAparcamiento modaparcamiento = new ModeloAparcamiento();
	
		modgeneracion.aplicar(esc, conAcelmax, probCreacionTiposCond, probAparcarTiposCond, probCreacionTiposVeh);
		
		int numcarriles = esc.getCarretera().getListaCarriles().size()-1; //restandole 1 a size evitamos que recorra el CarrilAparcamiento.
		
		for(int i=0; i<numcarriles; i++){
			
			CarrilNormalImpl carrilactual = (CarrilNormalImpl) esc.getCarretera().getListaCarriles().get(i);
			
			for(int j=0; j<carrilactual.getListaParCV().size(); j++){
				
				ParCV actualbucle = carrilactual.getListaParCV().get(j);
				
				if(actualbucle.getEstadoActual().getPosicion()>esc.getCarretera().getListaCarriles().get(i).getFin()){
					
				/*prueba*/ParCV anterior1=actualbucle.getAnterior();
					if(actualbucle.getAnterior()!=null){
						actualbucle.getAnterior().setSiguiente(null);
					}
					
					esc.getLlegada().add(actualbucle);
					carrilactual.getListaParCV().remove(actualbucle);
				/*prueba*/ParCV anterior2=actualbucle.getAnterior();
					j--;
				}else{
					
					if(actualbucle.getConductor().getAparcar()){						
						modaparcamiento.aplicaModelo(esc, actualbucle, i, j, aparcado);
						
						//REVISAR****
						if(aparcado.getAparcado()){
							j--;
							aparcado.setAparcado(false);
						}
						
					}else{
						modcomportamiento.aplicaModelo(esc, actualbucle, i, j);
					}
						
				}
			}
		}
	
	}
	
}